import {
  Controller,
  Post,
  UploadedFile,
  UseInterceptors,
  Request,
  UseGuards,
  NotFoundException,
  Get,
  Param,
  Res,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { diskStorage, File } from 'multer';
import { extname } from 'path';
import { AuthGuard } from '@nestjs/passport'; // 使用 passport 的 jwt 认证守卫
import { UploadService } from './upload.service';
import * as path from 'path';
import * as fs from 'fs';
import { Response } from 'express';
@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}

  @Post('single')
  @UseGuards(AuthGuard('jwt')) // 使用 JWT 认证
  // 上传单个文件
  @UseInterceptors(
    // 使用 multer 拦截器
    FileInterceptor('file', {
      // 配置 multer 拦截器
      storage: diskStorage({
        // 使用 diskStorage 存储文件
        destination: './uploads', // 文件存储路径
        filename: (req, file, callback) => {
          // 生成唯一的文件名
          const uniqueSuffix = `${Date.now()}-${Math.round(Math.random() * 1e9)}`;
          callback(
            null,
            `${file.fieldname}-${uniqueSuffix}${extname(file.originalname)}`,
          );
        },
      }),
      fileFilter: (req, file, callback) => {
        // 文件类型过滤
        const allowedTypes = /jpg|jpeg|png|gif/;
        // 允许的文件类型
        const mimetype = allowedTypes.test(file.mimetype);
        // 检查文件类型
        if (extname && mimetype) {
          return callback(null, true); // 通过验证
        } else {
          callback(
            new NotFoundException('文件类型不对或文件大小大于10m'),
            false,
          );
        }
      },
      limits: {
        fileSize: 10 * 1024 * 1024, // 文件大小限制：10MB
      },
    }),
  )
  // 上传单个文件
  async uploadSingle(@UploadedFile() file: File, @Request() req) {
    const userId = req.user.data.id; // 从 JWT 中提取用户信息
    console.log(req.body);
    const savedFile = await this.uploadService.saveUserFile(file, userId);
    return {
      message: '文件上传成功',
      file: savedFile,
    };
  }
  // 根据文件名访问文件
  @UseGuards(AuthGuard('jwt')) // 使用 JWT 认证
  @Get(':filename')
  async getFile(@Param('filename') filename: string, @Res() res: Response) {
    // 构造文件路径
    const filePath = path.join(__dirname, '..', '..', 'uploads', filename);

    // 检查文件是否存在
    if (!fs.existsSync(filePath)) {
      throw new NotFoundException('文件不存在');
    }

    // 返回文件
    res.sendFile(filePath);
  }
  // 保存分类图片
  @Post('category')
  @UseGuards(AuthGuard('jwt')) // 使用 JWT 认证
  @UseInterceptors(
    FileInterceptor('file', {
      storage: diskStorage({
        destination: './uploads',
        filename: (req, file, callback) => {
          const uniqueSuffix = `${Date.now()}-${Math.round(Math.random() * 1e9)}`;
          callback(
            null,
            `${file.fieldname}-${uniqueSuffix}${extname(file.originalname)}`,
          );
        },
      }),
      fileFilter: (req, file, callback) => {
        const allowedTypes = /jpg|jpeg|png|gif/;
        const mimetype = allowedTypes.test(file.mimetype);
        if (extname && mimetype) {
          return callback(null, true);
        } else {
          callback(
            new NotFoundException('文件类型不对或文件大小大于10m'),
            false,
          );
        }
      },
      limits: {
        fileSize: 10 * 1024 * 1024,
      },
    }),
  )
  // 保存分类图片
  async saveCategoryFile(@UploadedFile() file: File, @Request() req) {
    const categoryId = req.body.categoryId;
    console.log(file);
    const result = await this.uploadService.saveCategoryFile(file, categoryId);
    return result;
  }
  // 保存链接图片
  @Post('link')
  @UseGuards(AuthGuard('jwt')) // 使用 JWT 认证
  @UseInterceptors(
    FileInterceptor('file', {
      storage: diskStorage({
        destination: './uploads',
        filename: (req, file, callback) => {
          const uniqueSuffix = `${Date.now()}-${Math.round(Math.random() * 1e9)}`;
          callback(
            null,
            `${file.fieldname}-${uniqueSuffix}${extname(file.originalname)}`,
          );
        },
      }),
      fileFilter: (req, file, callback) => {
        const allowedTypes = /jpg|jpeg|png|gif/;
        const mimetype = allowedTypes.test(file.mimetype);
        if (extname && mimetype) {
          return callback(null, true);
        } else {
          callback(
            new NotFoundException('文件类型不对或文件大小大于10m'),
            false,
          );
        }
      },
      limits: {
        fileSize: 10 * 1024 * 1024,
      },
    }),
  )
  async saveLinkFile(@UploadedFile() file: File, @Request() req) {
    const linkId = req.body.linkId;
    const result = await this.uploadService.saveLinkFile(file, linkId);
    return result;
  }
}
